import pymysql


class DBUtil:
    # 定义类属性
    conn = None  # 3、定义类变量，为了是消除警告

    # 封装一个创建数据库链接的方法 ，添加装饰器@classmethod 目的是为了调用方便
    @classmethod
    def __connect_db(cls):  # __connect_db私有的方法
        # 1、添加到类属性，目的是为了让其它方法调用到这个属性，把这个链接对象conn返回
        cls.conn = pymysql.connect(host="211.103.136.244", port=7061, user="student", password="iHRM_student_2022",
                                   database="ihrm", charset="utf8")
        return cls.conn
        pass

    # 封装一个关闭数据库链接的方法，把connect_dbb 这个方法变成私有方法，
    # 添加 __() 目的是为了不让调用方看到内部方法的实现(调用方不关心）
    @classmethod
    def __close_db(cls):
        cls.conn.close()  # 2关闭链接的方法
        pass

    # 封装一个读取数据库的方法
    @classmethod
    def query_db(cls, sql):

        result1 = None
        cursor = None
        try:
            # 1、创建数据库的链接
            cls.conn = cls.__connect_db()  # 调用封装数据库链接的方法 connect db0
            # 2、获取游标
            cursor = cls.conn.cursor()
            # 3 执行sgl，获取结果集，需要返回结果
            cursor.execute(sql)
            result1 = cursor.fetchone()  # 只封装一个fetchone ( )的方法
        except Exception as arr:
            print(f"读取错误信息:{arr}")
        finally:
            # 4 关闭游标
            cursor.close()
            # 5 关闭数据库的链接
            cls.__close_db()  # 调用关闭数据库的方法
            return result1  # 把结果集返回return

    # 封装一个增、删、改、数据库的方法
    @classmethod
    def uid_db(cls, sql):
        cursor = None

        try:
            # 1、创建数据库的链接
            cls.conn = cls.__connect_db()
            # 2、获取游标
            cursor = cls.conn.cursor()
            # 3 执行sgl，获取结果集，需要返回结果
            cursor.execute(sql)
            # 打印一下影响的行数
            affect_rows = cls.conn.affected_rows()
            print(f"影响的行数：{affect_rows}")
            # 5.提交/回滚事务
            cls.conn.commit()  # 成功的话，事务提交
        except Exception as arr:
            print(f"读取错误信息:{arr}")
            cls.conn.affected_rows()  # 报错的话进行事务的回顾
        finally:
            # 4 关闭游标
            cursor.close()
            # 5 关闭数据库的链接
            cls.__close_db()


if __name__ == '__main__':
    pass
    # 方法的调用
    # while True:
    #     select_sql = 'select * from t_book'
    #     print(DBUtil.query_db(select_sql))
    #     t_book_id = DBUtil.query_db(select_sql)[0]
    #
    #     delete_sql = f"DELETE FROM t_book WHERE id = {t_book_id} ;"
    #     DBUtil.uid_db(delete_sql)
